"""
饮食类型表 Service 层（业务逻辑层）
负责封装饮食类型相关的业务逻辑，调用 DAO 层进行数据操作
返回格式统一为：(是否成功, 提示信息/数据字典)
"""
from app.Dao.HealthDao.FoodDao.FoodCateDao import FoodCateDAO  # 假设 DAO 类在 app/dao/food_cate_dao.py
from sqlalchemy.exc import IntegrityError, SQLAlchemyError


class FoodCateServices:
    """饮食类型 Service 类，封装业务逻辑"""

    @staticmethod
    def add_food_cate(food_cate_name):
        """
        新增饮食类型（业务逻辑：校验名称非空 + 调用 DAO 新增）
        :param food_cate_name: 饮食类型名称
        :return: (bool, str) - (成功标识, 提示信息)
        """
        # 1. 基础参数校验
        if not food_cate_name or food_cate_name.strip() == "":
            return False, "饮食类型名称不能为空"

        # 2. 调用 DAO 层新增
        try:
            new_cate = FoodCateDAO.add_food_cate(food_cate_name)
            return True, f"新增饮食类型成功，ID：{new_cate.id}，名称：{new_cate.food_cate_name}"
        except IntegrityError as e:
            return False, str(e).split("\n")[0]  # 提取核心错误信息
        except SQLAlchemyError as e:
            return False, f"新增失败：{str(e)}"
        except Exception as e:
            return False, f"系统异常：{str(e)}"

    @staticmethod
    def get_food_cate_by_id(cate_id):
        """
        根据 ID 查询饮食类型
        :param cate_id: 饮食类型 ID
        :return: (bool, dict/str) - (成功标识, 数据字典/提示信息)
        """
        try:
            cate = FoodCateDAO.get_food_cate_by_id(cate_id)
            if cate:
                return True, cate.to_dict()
            else:
                return False, f"未查询到 ID 为 {cate_id} 的饮食类型"
        except SQLAlchemyError as e:
            return False, f"查询失败：{str(e)}"
        except Exception as e:
            return False, f"系统异常：{str(e)}"

    @staticmethod
    def get_food_cate_by_name(food_cate_name):
        """
        根据名称查询饮食类型（精确匹配）
        :param food_cate_name: 饮食类型名称
        :return: (bool, dict/str) - (成功标识, 数据字典/提示信息)
        """
        # 1. 基础参数校验
        if not food_cate_name or food_cate_name.strip() == "":
            return False, "查询名称不能为空"

        try:
            cate = FoodCateDAO.get_food_cate_by_name(food_cate_name)
            if cate:
                return True, cate.to_dict()
            else:
                return False, f"未查询到名称为 {food_cate_name} 的饮食类型"
        except SQLAlchemyError as e:
            return False, f"查询失败：{str(e)}"
        except Exception as e:
            return False, f"系统异常：{str(e)}"

    @staticmethod
    def get_all_food_cates():
        """
        查询所有饮食类型
        :return: (bool, list/str) - (成功标识, 数据列表/提示信息)
        """
        try:
            cate_list = FoodCateDAO.get_all_food_cates()
            # 转换为字典列表返回
            data = [cate.to_dict() for cate in cate_list]
            return True, data
        except SQLAlchemyError as e:
            return False, f"查询所有饮食类型失败：{str(e)}"
        except Exception as e:
            return False, f"系统异常：{str(e)}"

    @staticmethod
    def update_food_cate(cate_id, new_food_cate_name):
        """
        根据 ID 更新饮食类型名称（业务逻辑：校验参数 + 调用 DAO 更新）
        :param cate_id: 要更新的饮食类型 ID
        :param new_food_cate_name: 新的饮食类型名称
        :return: (bool, str) - (成功标识, 提示信息)
        """
        # 1. 基础参数校验
        if not cate_id or not isinstance(cate_id, int):
            return False, "饮食类型 ID 必须是有效的整数"
        if not new_food_cate_name or new_food_cate_name.strip() == "":
            return False, "新的饮食类型名称不能为空"

        # 2. 调用 DAO 层更新
        try:
            updated_cate = FoodCateDAO.update_food_cate(cate_id, new_food_cate_name)
            if updated_cate:
                return True, f"更新成功：ID {cate_id}，新名称：{updated_cate.food_cate_name}"
            else:
                return False, f"更新失败：未查询到 ID 为 {cate_id} 的饮食类型"
        except IntegrityError as e:
            return False, str(e).split("\n")[0]
        except SQLAlchemyError as e:
            return False, f"更新失败：{str(e)}"
        except Exception as e:
            return False, f"系统异常：{str(e)}"

    @staticmethod
    def delete_food_cate(cate_id):
        """
        根据 ID 删除饮食类型
        :param cate_id: 要删除的饮食类型 ID
        :return: (bool, str) - (成功标识, 提示信息)
        """
        # 1. 基础参数校验
        if not cate_id or not isinstance(cate_id, int):
            return False, "饮食类型 ID 必须是有效的整数"

        # 2. 调用 DAO 层删除
        try:
            success = FoodCateDAO.delete_food_cate(cate_id)
            if success:
                return True, f"删除成功：ID {cate_id} 的饮食类型已删除"
            else:
                return False, f"删除失败：未查询到 ID 为 {cate_id} 的饮食类型"
        except SQLAlchemyError as e:
            # 外键关联等异常提示
            return False, f"删除失败：{str(e)}（可能存在关联数据，请先处理关联关系）"
        except Exception as e:
            return False, f"系统异常：{str(e)}"

    @staticmethod
    def search_food_cates_by_keyword(keyword):
        """
        按关键词模糊查询饮食类型
        :param keyword: 搜索关键词
        :return: (bool, list/str) - (成功标识, 数据列表/提示信息)
        """
        if not keyword or keyword.strip() == "":
            return False, "搜索关键词不能为空"

        try:
            cate_list = FoodCateDAO.get_food_cates_by_keyword(keyword)
            data = [cate.to_dict() for cate in cate_list]
            if data:
                return True, data
            else:
                return True, f"未查询到包含关键词「{keyword}」的饮食类型"  # 无结果仍返回成功标识，提示无数据
        except SQLAlchemyError as e:
            return False, f"搜索失败：{str(e)}"
        except Exception as e:
            return False, f"系统异常：{str(e)}"
